import axios from 'axios'
import router from '@/router'
import store from '@/store'
import { Notification, MessageBox, Message, Loading } from 'element-ui'
import projectConfig from '@/projectConfig'
import { getCookie } from '@/utils/common'

const service = axios.create(projectConfig.axiosConfig)
// 添加等待层
let loading = null
axios.defaults.headers['Content-Type'] = 'application/json;charset=utf-8'

/**
 * 添加请求拦截器:post参数问题（需要序列化的参数）
 */
service.interceptors.request.use(
  // 在发送请求之前做什么
  config => {
    // if (config.method === 'post') {
    //   // post请求需要序列化
    //   config.data = JSON.stringify(config.data)
    // }
    // 如果没有请求参数，创建一个默认参数
    if (!config.data) {
      config.data = { t: new Date().getTime() }
    }
    // console.log('login', config)
    if (!config.noNeedLogin) {
      // let id = JSON.parse(sessionStorage.getItem('id'))
      // let token = JSON.parse(sessionStorage.getItem('token'))
      let id = !$chy.isEmpty(getCookie('user')) ? JSON.parse(getCookie('user')).id : ''
      let token = !$chy.isEmpty(getCookie('user')) ? JSON.parse(getCookie('user')).token : ''
      if (!$chy.isEmpty(id) && !$chy.isEmpty(token)) {
        config.headers['Authorization'] = 'Bearer ' + token
      }
    }
    // 创建等待层实例
    loading = Loading.service({
      lock: true,
      text: '',
      // spinner: 'el-loading-spinner',
      spinner: 'et-icon-loading el-icon-loading',
      background: 'rgba(0, 0, 0, 0.1)'
    })
    return config
  },
  // 对请求错误做点什么
  error => Promise.reject(error)
)

/**
 * 添加响应拦截器
 */
service.interceptors.response.use(
  // 对响应数据做点什么
  response => {
    loading && loading.close()
    // console.log('response', response)
    if (response.status === 200) {
      if (response.data.code !== 1) {
        errorHandle(response.data.code, response.data.msg)
      }

      return Promise.resolve(response.data)
    } else {
      return Promise.reject(response.data)
    }
  },
  // 对响应错误做点什么
  error => {
    const { response } = error
    console.log(error)
    httpErrorHandle(response.status, response.info)
    return Promise.reject(response.data)
  }
)

/**
 * 处理业务失败的方法
 * status: 状态码
 * ****  2xx ：成功
 *       3xx : 请求的资源重定向到其他网页
 *       4xx ： 客户端错误
 *       5xx ： 服务器内部错误
 * info: 失败的信息
 */
const errorHandle = (code, msg) => {
  switch (code) {
    case 5001:
      //  用户未登录
      Message.error(msg)
      store.commit('user/addUserInfo', {})
      $chy.deleteCookie('user')
      router.replace('/login')
      break
    case 5002:
      //  登录已过期
      Message.error(msg)
      store.commit('user/addUserInfo', {})
      $chy.deleteCookie('user')
      router.replace('/login')
      break
    default:
      Message.error(msg)
      break
  }
}
/**
 * 处理http失败的方法
 * status: 状态码
 * ****  2xx ：成功
 *       3xx : 请求的资源重定向到其他网页
 *       4xx ： 客户端错误
 *       5xx ： 服务器内部错误
 * info: 失败的信息
 */
const httpErrorHandle = (status, info) => {
  switch (status) {
    case 400:
      Message.error('语义有误，当前去请求无法被服务器理解！')
      break
    case 401:
      // token
      Message.error('服务器认证错误！当前请求需要用户验证。')
      break
    case 403:
      Message.error('服务器已经理解请求，但拒绝执行！')
      break
    case 404:
      Message.error('请检查网络请求地址')
      break
    case 500:
      Message.error('服务器遇到了一个未曾预料的状况，导致它无法完成对请求的处理。')
      break
    case 502:
      Message.error('作为网关或者代理的服务器尝试请求时，从上游服务器接收到无效的响应')
      break
    default:
      Message.error(info)
      break
  }
}

export default service
